// hdu5781
// 题意：
// 现在alice有一些钱存在ATM机里，但是她忘了存了多少，只知道上限是k(<=2000),
// 她的存款可能是[0, k]中等概率的某一个整数值，现在她每次可以尝试取
// 面值为y的存款，如果她账上剩余钱数足够，就取走y面值的钱，否则，ATM机会给
// 她一个警告，如果她收到超过w(<=2000)次警告，她就会被警察带走。现在问，
// alice都以最好的策略，并且在不被警察带走的情况下，她把钱都取出来
// 期望的次数是多少？
//
// 题解：
// 其实这题很简单，根据期望的线性性，做一个dp求期望就行，就设f[k][w]表示
// 存款上界为k，剩余w次警告的期望，然后O(k)枚举转移。
//
#include <iostream>
#include <iomanip>

int const maxk = 2007;
int const maxw = 17;
double f[maxk][maxw];

int k, w;

double dp(int k, int w)
{
	if (f[k][w] > 0) return f[k][w];
	if (w == 1) return f[k][w] = (double)((1 + k) * k / 2 + k) / (double)(k + 1);
	if (!k) return 0;
	double min = 1e22;
	for (int i = 1; i <= k; i++) {
		double tmp = dp(i - 1, w - 1) * i / (k + 1);
		tmp += dp(k - i, w) * (k - i + 1) / (k + 1) + 1;
		min = std::min(min, tmp);
	}
	return f[k][w] = min;
}

void init()
{
	for (int i = 0; i < maxk; i++)
		for (int j = 0; j < maxw; j++)
			f[i][j] = -1;

	for (int i = 1; i < maxk; i++) {
		for (int j = 1; j < maxw; j++)
			f[i][j] = dp(i, j);
	}
}

int main()
{
	std::ios_base::sync_with_stdio(false);
	init();
	while (std::cin >> k >> w) {
		w = std::min(w, 16);
		std::cout << std::fixed << std::setprecision(6) << f[k][w] << "\n";
	}
}

